package com.maolong.ackrece.service;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
@Slf4j
public class MessageRecive {
    /**
     * 消费者接收消息确认机制
     * 检查是否重复传递，如果重复，代表两次传递都失败了，那么中止
     * 如果没重复，重新发一次
     * @param body
     * @param channel
     * @param message
     * @throws IOException
     */

    /**
     * body消息的主体内容
     * channel通道，表示消息传递的通道
     * message消息对象，包含消息的详细信息
     */
    @RabbitListener(queues = {"ack_queue"})
    public void reciveMessage(String body, Channel channel, Message message) throws IOException {
        try {
            //开始业务处理
            if("3".equals(body)){
                log.info("收到异常队列信息{}",body);
                int ret = 1 / 0;
            }
            log.info("收到队列信息{}", body);
            //业务处理结束
            //手动确认
            /**
             * (long deliveryTag, boolean multiple)
             * deliveryTag：消息的标识
             * multiple：是否批量确认,false表示只确认当前消息
             */
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        }catch (Exception e){
            //表示消息是否重复处理
            if(message.getMessageProperties().getRedelivered()){
                //拒绝签收
                channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                log.info("进行消息拒收");
            }else{
                //返回队列，重新发送
                channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
                log.info("进行消息重传");
            }
        }
    }


}
